﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NetFrameworkExtensions.BusinessLayer;

namespace NetFrameworkExtensions.PresentationLayer
{
  /// <summary>
  /// This interface allows to choose among different types of interactive screens 
  /// to manage objects of type T
  /// </summary>
  /// <typeparam name="T">The type of object to manage</typeparam>
  public interface IEntityInteractions
  {
    Guid Identifier { get; }
  }

  /// <summary>
  /// This interface allows to choose among different types of interactive screens 
  /// to manage objects of type T
  /// </summary>
  /// <typeparam name="T">The type of object to manage</typeparam>
  public interface IEntitySelectionInteractions<TEntity> :
    IEntityInteractions
    where TEntity : class, IGuidIdentified
  {
    /// <summary>
    /// Este método demanda la selección de un objeto de tipo T. Este método generalmente abre una ventana modal que permite filtrar y buscar entre todos los objetos de tipo T.
    /// </summary>
    /// <param name="callback">Permite conocer la instancia seleccionada</param>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen SelectSingle(Action<TEntity> callback, IWindowContext context = null);

    /// <summary>
    /// Este método demanda la selección de varios objetos de tipo T. Este método generalmente abre una ventana modal que permite filtrar y buscar entre todos los objetos de tipo T.
    /// </summary>
    /// <param name="callback">Permite conocer la lista de instancias seleccionadas</param>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen SelectMultiple(Action<IEnumerable<TEntity>> callback, IWindowContext context = null);
  }

  /// <summary>
  /// This interface allows to choose among different types of interactive screens 
  /// to manage objects of type T
  /// </summary>
  /// <typeparam name="T">The type of object to manage</typeparam>
  public interface IEntityInteractions<TEntity> :
    IEntitySelectionInteractions<TEntity>
    where TEntity : class, IGuidIdentified
  {
    /// <summary>
    /// Permite mostrar la ventana para gestionar la lista de elementos de tipo T
    /// La implementación de este método deberá crear el modelo de vista y la vista correspondientes a 
    /// la gestión de lista de T (Person, Order, Company, etc), en un modo que permita 
    /// filtrar, crear, editar y eliminar elementos.
    /// </summary>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen Manage(IWindowContext context = null);

    /// <summary>
    /// Este método demanda la creación de un objeto de tipo T. La implementación por lo general 
    /// creará una ventana para editar una instancia de T en memoria para luego ser salvada.
    /// </summary>
    /// <param name="callback">Al terminar la salva del objeto creado, se llama al callback, pasando como argumento el objeto creado. Si se cancela la creación del objeto u ocurre una excepción, se llama al callback pasando null.</param>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen Create(Action<TEntity> callback = null, IWindowContext context = null);

    /// <summary>
    /// Este método demanda la edición de un objeto de tipo T, a partir de su identificador.
    /// </summary>
    /// <param name="itemId">Identificador del elemento a editar</param>
    /// <param name="callback">Devuelve el elemento editado o null si se canceló la edición.</param>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen Edit(TEntity entity, IWindowContext context = null);

    /// <summary>
    /// Este método demanda la eliminación de una instancia de T.
    /// </summary>
    /// <param name="itemId">Identificador del elemento a editar</param>
    /// <param name="callback">Devuelve true luego de realizar la eliminación, o false si se cancela la eliminación.</param>
    /// <returns>Devuelve una interfaz que permite gestionar la pantalla que muestra la operación interactiva</returns>
    IInteractiveScreen Delete(TEntity entity, IWindowContext context = null);
  }

  /// <summary>
  /// This interface allows to choose among different types of interactive screens 
  /// to manage objects of type T
  /// </summary>
  /// <typeparam name="T">The type of object to manage</typeparam>
  public interface IHierarchicalEntityInteractions<TEntity> :
    IEntityInteractions<TEntity>
    where TEntity : class, IGuidIdentified
  {
    IInteractiveScreen CreateChild(IGuidIdentified parent, Action<TEntity> callback = null, IWindowContext context = null);
  }
}
